# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :db.py
# @Time      :2022/3/18 21:31
# @Author    :Yongbo Zhou
import traceback

import pymysql
from dbutils.persistent_db import PersistentDB

pool = PersistentDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxusage=None,  # 一个链接最多被重复使用的次数，None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。
    ping=0,
    # ping MySQL服务端，检查是否服务可用。
    closeable=False,
    # 如果为False时， conn.close() 实际上被忽略，供下次使用，再线程关闭时，才会自动关闭链接。如果为True时， conn.close()则关闭链接，那么再次调用pool.connection时就会报错，因为已经真的关闭了连接（pool.steady_connection()可以获取一个新的链接）
    threadlocal=None,  # 本线程独享值得对象，用于保存链接对象，如果链接对象被重置
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root',
    database='smart',
    charset='utf8'
)


# def db_con(host='localhost',
#            user='root',
#            password='root',
#            database='smart'):
#     return pymysql.connect(host=host, user=user, password=password, database=database)
#
#
# db = db_con()


def insert(sql: str, values: tuple):
    # db = db_con()

    ret = None
    conn = pool.connection()
    cursor = conn.cursor()
    try:
        # print("INSERT SQL : {s}", sql)
        cursor.execute(sql, values)
        ret = cursor.lastrowid
        conn.commit()
    except:
        conn.rollback()
        raise Exception(traceback.format_exc())
    cursor.close()
    conn.close()
    return ret


# 插入字典
def insert_dict(table: str, data: dict):
    keys = ','.join(data.keys())
    values = ','.join(['%s'] * len(data))
    sql = 'INSERT INTO {table}({keys}) VALUES({values})'.format(table=table, keys=keys, values=values)
    return insert(sql, tuple(data.values()))
